package com.liu.activemq.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class JmsProduce_TX {

    public static final String ACTIVEMQ_URL = "tcp://192.168.25.133:61616";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂,按照给定的url地址访问
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂，获得连接connection并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //创建会话,两个参数：第一个事务、第二个签收
        //若开启事务，则需要在程序结尾加上commit操作
        Session session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);

        //创建目的地(是队列还是主题)
        Destination queue = session.createQueue(QUEUE_NAME);//Conllection c = new ArrayList()

        //创建消息生产者
        MessageProducer producer = session.createProducer(queue);
//        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//非持久化
//        producer.setDeliveryMode(DeliveryMode.PERSISTENT);//持久化
        /**
         * MQ信息持久化
         *      producer.setDeliveryMode(参数为1时不持久化，为2时进行持久化)
         *      ActiveMQ默认的持久化策略是持久化
         */

        //发送消息，使用MessageProducer发送三条消息但MQ队列里
        for (int i = 0; i < 3; i++) {
//            TextMessage textMessage = session.createTextMessage("msg----" + i);//一个字符串
            MapMessage mapMessage = session.createMapMessage();
            mapMessage.setStringProperty("count", Integer.toString(i));//设置信息属性，添加信息识别度
            mapMessage.setString("k1", "v" + i);
            //通过消息生产者发送
            producer.send(mapMessage);
        }

        //关闭资源
        try {
            session.commit();
        } catch (Exception e) {
            session.rollback();
        } finally {
            if (null != session) {
                session.close();
            }
        }
        session.close();
        connection.close();

        System.out.println("MQ信息发送完毕");
    }
    /**
     * 对于MQ的事务，我们要明确一个观点，事务偏向于Produce(生产方)，签收偏向Consumer(消费方)
     * 在Produce端我们通过createSession传入true表明我们要以事务方式传输数据，在最后都要使用
     * commit来提交请求，否则事务无法提交至MQ服务器
     */
}
